// 程序五：命令行计算器
console.log('=== 命令行计算器 ===');

// 获取命令行参数
const args = process.argv.slice(2);

// 打印使用说明的函数
function printUsage() {
    console.log('\n使用方法:');
    console.log('  node calc.js <数学表达式>');
    console.log('  node calc.js --help 或 -h');
    console.log('\n示例:');
    console.log('  node calc.js "2 + 3"');
    console.log('  node calc.js "10 * 5"');
    console.log('  node calc.js "(1 + 2) * 3"');
    console.log('  node calc.js "Math.sqrt(16)"');
    console.log('\n支持的运算符:');
    console.log('  + (加法), - (减法), * (乘法), / (除法)');
    console.log('  % (取余), ** (幂运算)');
    console.log('\n支持的函数:');
    console.log('  Math.sin(), Math.cos(), Math.sqrt(), Math.abs() 等');
    console.log('\n注意: 表达式需要用引号包围');
}

// 检查命令行参数
if (args.length === 0) {
    console.log('错误: 没有提供数学表达式');
    printUsage();
    process.exit(1);
}

// 检查帮助参数
if (args[0] === '--help' || args[0] === '-h') {
    printUsage();
    process.exit(0);
}

// 如果参数多于3个，忽略多余的参数
if (args.length > 3) {
    console.log('警告: 参数过多，只使用前3个参数');
    args.splice(3);
}

// 合并所有参数为表达式
const expression = args.join(' ');

console.log(`输入的表达式: ${expression}`);

// 安全的数学表达式求值函数
function safeEval(expr) {
    try {
        // 移除可能的危险字符和函数
        const dangerousPatterns = [
            /require\s*\(/g,
            /process\./g,
            /global\./g,
            /__dirname/g,
            /__filename/g,
            /eval\s*\(/g,
            /Function\s*\(/g,
            /setTimeout\s*\(/g,
            /setInterval\s*\(/g,
            /console\./g
        ];
        
        let safeExpr = expr;
        dangerousPatterns.forEach(pattern => {
            if (pattern.test(safeExpr)) {
                throw new Error('表达式包含不安全的代码');
            }
        });
        
        // 只允许数字、运算符、括号、Math对象和基本数学函数
        const allowedPattern = /^[0-9+\-*/().\s,Math\s\w()]+$/;
        if (!allowedPattern.test(safeExpr)) {
            throw new Error('表达式包含不允许的字符');
        }
        
        // 使用Function构造器进行安全的求值
        const result = new Function('Math', `return ${safeExpr}`)(Math);
        
        // 检查结果是否为有效数字
        if (typeof result !== 'number' || !isFinite(result)) {
            throw new Error('计算结果不是有效数字');
        }
        
        return result;
    } catch (error) {
        throw new Error(`表达式求值失败: ${error.message}`);
    }
}

// 执行计算
try {
    const result = safeEval(expression);
    console.log(`计算结果: ${result}`);
    
    // 如果结果是整数，也显示整数形式
    if (Number.isInteger(result)) {
        console.log(`整数结果: ${result}`);
    } else {
        console.log(`小数结果: ${result}`);
        console.log(`四舍五入: ${Math.round(result)}`);
    }
    
} catch (error) {
    console.log(`错误: ${error.message}`);
    console.log('\n请检查表达式是否正确，支持的格式:');
    console.log('  - 基本运算: 2 + 3, 10 * 5');
    console.log('  - 括号运算: (1 + 2) * 3');
    console.log('  - 数学函数: Math.sqrt(16), Math.sin(Math.PI/2)');
    console.log('  - 幂运算: 2 ** 3');
    
    process.exit(1);
}

// 显示一些额外的信息
console.log('\n--- 计算详情 ---');
console.log(`原始表达式: ${expression}`);
console.log(`参数个数: ${args.length}`);
console.log(`参数列表: [${args.map(arg => `"${arg}"`).join(', ')}]`);
